package com.dongliusuo.orangeforms.webadmin.app.model;

import com.baomidou.mybatisplus.annotation.*;
import com.dongliusuo.orangeforms.application.common.constant.Gender;
import com.dongliusuo.orangeforms.application.common.constant.CertType;
import com.dongliusuo.orangeforms.common.core.util.MyCommonUtil;
import com.dongliusuo.orangeforms.common.core.annotation.*;
import com.dongliusuo.orangeforms.common.core.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.Date;
import java.util.Map;
import java.util.List;

/**
 * 客户主数据实体对象。
 *
 * @author DongLiusuo
 * @date 2025-01-08
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName(value = "customer_info")
public class CustomerInfo extends BaseModel {

    /**
     * 唯一标识符。
     */
    @UniqueVerifyField
    @TableId(value = "customer_id")
    private Long customerId;

    /**
     * 名。
     */
    @TableField(value = "first_name")
    private String firstName;

    /**
     * 姓。
     */
    @TableField(value = "last_name")
    private String lastName;

    /**
     * 电子邮件。
     */
    @TableField(value = "email")
    private String email;

    /**
     * 电话号码。
     */
    @TableField(value = "phone_number")
    private String phoneNumber;

    /**
     * 性别。
     */
    @TableField(value = "gender")
    private String gender;

    /**
     * 出生日期。
     */
    @TableField(value = "birth_date")
    private Date birthDate;

    /**
     * 证件类型。
     */
    @TableField(value = "id_type")
    private String idType;

    /**
     * 证件号码。
     */
    @TableField(value = "id_number")
    private String idNumber;

    /**
     * 国籍。
     */
    @TableField(value = "nationality")
    private String nationality;

    /**
     * 省行政区划代码。
     */
    @TableField(value = "province_code")
    private String provinceCode;

    /**
     * 市行政区划代码。
     */
    @TableField(value = "city_code")
    private String cityCode;

    /**
     * 区行政区划代码。
     */
    @TableField(value = "district_code")
    private String districtCode;

    /**
     * 详细地址1。
     */
    @TableField(value = "detailed_address1")
    private String detailedAddress1;

    /**
     * 详细地址2。
     */
    @TableField(value = "detailed_address2")
    private String detailedAddress2;

    /**
     * 完整地址。
     */
    @TableField(value = "full_address")
    private String fullAddress;

    /**
     * 职业。
     */
    @TableField(value = "occupation")
    private String occupation;

    /**
     * 公司名称。
     */
    @TableField(value = "company_name")
    private String companyName;

    /**
     * 收入范围。
     */
    @TableField(value = "income_range")
    private String incomeRange;

    /**
     * 紧急联系人姓名。
     */
    @TableField(value = "emergency_contact_name")
    private String emergencyContactName;

    /**
     * 紧急联系人电话。
     */
    @TableField(value = "emergency_contact_phone")
    private String emergencyContactPhone;

    /**
     * 注册日期。
     */
    @TableField(value = "registration_date")
    private Date registrationDate;

    /**
     * 最后登录时间。
     */
    @TableField(value = "last_login")
    private Date lastLogin;

    /**
     * 用户状态。
     */
    @TableField(value = "status")
    private String status;

    /**
     * 其他备注信息。
     */
    @TableField(value = "remark")
    private String remark;

    /**
     * 逻辑删除标记字段(1: 正常 -1: 已删除)。
     */
    @TableLogic
    @TableField(value = "deleted_flag")
    private Integer deletedFlag;

    /**
     * birthDate 范围过滤起始值(>=)。
     */
    @TableField(exist = false)
    private String birthDateStart;

    /**
     * birthDate 范围过滤结束值(<=)。
     */
    @TableField(exist = false)
    private String birthDateEnd;

    /**
     * registrationDate 范围过滤起始值(>=)。
     */
    @TableField(exist = false)
    private String registrationDateStart;

    /**
     * registrationDate 范围过滤结束值(<=)。
     */
    @TableField(exist = false)
    private String registrationDateEnd;

    /**
     * first_name / last_name / email / phone_number / id_number LIKE搜索字符串。
     */
    @TableField(exist = false)
    private String searchString;

    public void setSearchString(String searchString) {
        this.searchString = MyCommonUtil.replaceSqlWildcard(searchString);
    }

    /**
     * CustomerAccount 的一对多关联表数据对象。
     * 通常在一对多的关联中，我们基于从表数据过滤主表数据，此时需要先对从表数据进行嵌套子查询过滤，并将从表过滤数据列表集成到该字段。
     */
    @RelationOneToMany(
            masterIdField = "customerId",
            slaveModelClass = CustomerAccount.class,
            slaveIdField = "customerId")
    @TableField(exist = false)
    private List<CustomerAccount> customerAccountList;

    @RelationDict(
            masterIdField = "provinceCode",
            slaveModelClass = AreaCode.class,
            slaveIdField = "areaId",
            slaveNameField = "areaName")
    @TableField(exist = false)
    private Map<String, Object> provinceCodeDictMap;

    @RelationDict(
            masterIdField = "cityCode",
            slaveModelClass = AreaCode.class,
            slaveIdField = "areaId",
            slaveNameField = "areaName")
    @TableField(exist = false)
    private Map<String, Object> cityCodeDictMap;

    @RelationDict(
            masterIdField = "districtCode",
            slaveModelClass = AreaCode.class,
            slaveIdField = "areaId",
            slaveNameField = "areaName")
    @TableField(exist = false)
    private Map<String, Object> districtCodeDictMap;

    @RelationConstDict(
            masterIdField = "gender",
            constantDictClass = Gender.class)
    @TableField(exist = false)
    private Map<String, Object> genderDictMap;

    @RelationConstDict(
            masterIdField = "idType",
            constantDictClass = CertType.class)
    @TableField(exist = false)
    private Map<String, Object> idTypeDictMap;

    @RelationGlobalDict(
            masterIdField = "nationality",
            dictCode = "Country")
    @TableField(exist = false)
    private Map<String, Object> nationalityDictMap;

    @RelationGlobalDict(
            masterIdField = "incomeRange",
            dictCode = "MonthIncomeRange")
    @TableField(exist = false)
    private Map<String, Object> incomeRangeDictMap;
}
